07 复合类型类型 - 数组与切片的使用和注意事项 -1
- 数组(Array)是一种固定长度的同类型数据的序列。
- 它的长度在数组创建时就必须确定,数组一旦创建,其长度就不能改变。
- 数组的元素可以通过索引访问和修改。
数组的特点
- 长度固定:数组的长度是类型的一部分,
[3]int和[4]int是两种不同的类型。 - 元素类型相同:数组中的所有元素必须是相同的类型。
- 连续存储:数组在内存中是连续存储的。
- 值类型:数组是值类型,赋值或传递给函数时会生成数组的副本,而不是传递引用。
声明和初始化数组
数组声明需要指定数组的长度和元素的类型。
go
// 声明一个长度为 size 的 Type 类型数组
var arrayName [size]Type
// 声明一个长度为 5 的 int 数组
var arr [5]int
// 声明一个长度为 5 的 int 数组,并初始化
arr := [5]int{1, 2, 3, 4, 5}
// 未赋值的元素会默认初始化为类型的默认值
// var arr = [5]int{1, 2}
arr := [5]int{1, 2} // arr = [1, 2, 0, 0, 0]省略长度让编译器推导数组大小
go
// 通过数组的初始化表达式推导数组的长度
arr := [...]int{1, 2, 3} // 编译器推导出数组长度为 3访问和修改数组元素
go
// 通过索引来访问和修改数组元素,索引从 0 开始
arr[0] = 10
fmt.Println(arr[0]) // 输出:10数组的长度和容量
go
// 使用内置函数 len() 获取数组的长度
fmt.Println(len(arr)) // 输出数组的长度数组是值类型
数组是值类型,数组赋值或传递给函数时,会生成数组的副本,而不是直接引用。
go
func changeArray(arr [3]int) {
arr[0] = 100
}
arr := [3]int{1, 2, 3}
changeArray(arr)
fmt.Println(arr) // 输出:[1 2 3],原数组未改变要修改原数组,可以传递数组的指针。
go
func changeArray(arr *[3]int) {
arr[0] = 100
}
arr := [3]int{1, 2, 3}
changeArray(&arr)
fmt.Println(arr) // 输出:[100 2 3],原数组已改变注意
- 数组的长度是类型的一部分,
[3]int和[4]int是两种不同的类型。 - Go 语言中更常用的是切片(Slice),它是一种比数组更加灵活的集合类型,因为切片的长度可以动态改变。
- 数组适用于需要固定大小和高性能的场景,而切片则更适合需要灵活处理数据的情况。